package i386CodeGenerator;

import java.util.Vector;

/**
 * The Class RegisterAssigner.
 *
 * @author Attanasio Ruiz, German
 */

public class RegisterAssigner {

	Vector<String> reg, regFree, varInt, varIntFree;
	private static RegisterAssigner instance = null;

	/**
	 * @return
	 */
	public static RegisterAssigner getInstance() {
		if (instance == null)
			instance = new RegisterAssigner();
		return instance;
	}

	/**
	 *
	 */
	public RegisterAssigner() {
		reg = new Vector<String>();
		regFree = new Vector<String>();
		varInt = new Vector<String>();
		varIntFree = new Vector<String>();

		reg.add("BX");
		reg.add("CX");
		regFree.addAll(reg);

		varInt.add("varInt1");
		varInt.add("varInt2");
		varIntFree.addAll(varInt);
		
	}

	/**
	 * @param tipoDato
	 * @return
	 */
	public String getRegistro() {
		String aux = getLibre(regFree); // pide un registro de la lista de
										// libres
		if (aux == "REGERROR")
			return getLibre(varIntFree);

		 // Puesto que en la lista de registros solo
		 // guardamos los registros CX y BX, si
								// que hace referencia al reg de 32 bits
		return aux;
	}

	private String getLibre(Vector<String> lFree) {
		if (!lFree.isEmpty()) {
			String ret = lFree.remove(0);
			return ret;
		}
		return "REGERROR";
	}


	/**
	 * @param tipoDato
	 * @param variable
	 */
	public void liberarRegistro(String variable) {
		if (variable == "CX" || variable == "BX") {
			regFree.add(variable);
		} else {
			if (varInt.contains(variable))
				varIntFree.add(variable);
		}
	}


	/**
	 *
	 * libera todos los registros de un determinado vector.
	 * @param t
	 * @param fuente
	 */
	private void resetLista( Vector<String> fuente) {
		for (String e : fuente) {
			liberarRegistro(e);
		}
	}

	/**
	 *
	 */
	public void resetAdministrador() {
		resetLista(reg);
		resetLista(varInt);
	}

	/**
	 * @param var
	 * @return
	 */
	public boolean esRegistro(String var) {
		return (var == "EBX" || var == "BX" || var == "ECX" || var == "CX");
	}

	/**
	 * @param dato
	 * @return
	 */
	String getVariable() {
			return getLibre(varIntFree);
	}

}
